# coding:utf-8

from sql_rice.utils import do_nothing


class MethodWraper(object):
    """permite asignar acciones a realizar con el valor de un metodo asi como
    asignar valores por defecto dinamicos"""

    def __init__(self, func, valide=None, do_with=do_nothing, factory=None):
        self._func = func
        self._valide = valide if valide else {}
        self._do_with = do_with
        self._factory = factory

    def valide(self, kwargs):
        """valide(**kwargs)-> Bool"""
        for name, validator in list(self._valide.items()):
            if not validator(kwargs[name]):
                return False
        return True

    def __call__(self, **kwargs):
        if kwargs:
            if self.valide(kwargs):
                values = self._func(**kwargs)
            else:
                raise ValueError('Args not passed validation')
        else:
            kparams = self._factory() if self._factory else ((), {})
            values = self._func(**kparams)
        self._do_with(values)
